#ifndef SHADER
#define SHADER

#include "../texture/texture.h"
#include "../core/math/array.h"

namespace sleek
{
    namespace mesh
    {
        enum shader_type
        {
            shd_frag = 0x1,
            shd_vert = 0x2,
            shd_geom = 0x4
        };
        class material;
        class shader
        {
            public:
                shader();
                virtual ~shader();

                void setVertexShader(core::os::stringc prog, core::os::stringc main);
                void setGeometryShader(core::os::stringc prog, core::os::stringc main);
                void setFragmentShader(core::os::stringc prog, core::os::stringc main);

                void compileShader();
                void attacheShader(core::u32);
                void detacheShader(core::u32);

                void setLinkToMaterial(material*);
                material* getLinkFromMaterial();

                void* getVariable(core::os::stringc);
                GLint getVariableID(core::os::stringc);

                void setVariable(core::os::stringc, core::f32);
                void setVariable(core::os::stringc, core::math::vector3df);

                void setTexture(core::os::stringc, GLuint, core::u32);
                void setTexture(core::os::stringc, texture::texture*, core::u32);

                virtual void UpdateCallback(){};

                core::os::stringc getFragmentShader();
                core::os::stringc getGeometryShader();
                core::os::stringc getVertexShader();

                void begin(); // active shader for render ( desactivate last shader )
                void end(); // desactive shader render ( desactivate last shader )
            protected:
                material *link;
                void LinkAndValidate();
                GLuint vs, ps, gs, prog;
                core::os::stringc frag, vert, geom;
                GLint comp;
        };
    }
}

#endif
